/*
Q:Go语言中的通道（channel）是什么？
A:通道是用于在goroutine之间进行通信和同步地机制，通道提供了一种安全的，阻塞式地方式来发送和接收数据，通过通道，可以实现多个goroutine之间的数据传递和同步
*/

package main

import "fmt"

func sum(a, b int, c chan int) {

	c <- a + b
}

func main() {
	c := make(chan int)

	go sum(1, 2, c)

	result := <-c

	fmt.Println(result)

	chanTest()
}

/*
在上述代码中，我们定义了一个sum函数，用于计算两个数的和，并将结果发送到通道c中。
在main函数中，我们创建了一个整型通道c，然后启动一个goroutine来执行sum函数，并将结果发送到通道中。
最后，我们通过从通道中接收结果，获取计算的和并打印出来。

通过使用通道，我们实现了goroutine之间的数据传递和同步。在示例中，通道c用于将计算结果从goroutine发送到主goroutine，实现了数据的传递和同步。
*/

func chanTest() {
	ch := make(chan int)

	go func() {
		ch <- 1
		ch <- 2
		ch <- 3

		close(ch)
	}()

	for {
		n, ok := <-ch
		if !ok {
			break
		}
		fmt.Println(n)
	}

	fmt.Println("done")

	/*
		result :
		 	1
			2
			3
			done
	*/
}

/*
在上面的代码中，我们使用make函数创建了一个整型通道ch。然后，我们启动了一个goroutine，向通道中写入了三个整数1、2和3，并在最后使用close函数关闭了通道。

接着，在主函数中，我们使用for循环不断从通道中读取数据，直到通道被关闭。每次从通道中读取到一个整数后，我们将它输出。最后输出"done"，表示所有的数据已经读取完毕。

因为通道是一种同步的数据传输方式，写入和读取会阻塞直到对方准备好，所以输出的结果应该是：1 2 3 done

注意：在通道被关闭后，读取操作仍然可以从通道中读取到之前写入的数据，这是因为通道中的数据并没有立即消失，而是在读取完毕后被垃圾回收器回收，
因此，在使用通道时，需要根据实际情况判断合适关闭通道，以避免出现不必要的竞态和内存泄露
*/
